<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        body,
        ul,
        li {
            padding: 0;
            margin: 0;
        }

        ul {
            list-style-type: none
        }

        .rating {
            width: 300px;
            height: 47px;
        }

        .rating-item {
            float: left;
            width: 48px;
            height: 47px;
            background: url(img/rating.png) no-repeat 0 0px;
            cursor: pointer
        }
    </style>
</head>

<body>

    <ul class="rating" id="rating">

        <li class="rating-item" title="很不好"></li>
        <li class="rating-item" title="不好"></li>
        <li class="rating-item" title="一般"></li>
        <li class="rating-item" title="好"></li>
        <li class="rating-item" title="很好"></li>

    </ul>

    <ul class="rating" id="rating1">

        <li class="rating-item" title="很不好"></li>
        <li class="rating-item" title="不好"></li>
        <li class="rating-item" title="一般"></li>
        <li class="rating-item" title="好"></li>
        <li class="rating-item" title="很好"></li>

    </ul>
    <script src="http://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script>
    <script>
        // 2、使用立刻执行函数将它包起来，减少对全局变量的污染
        var rating = (function () {

            var $rating;

            var init = function (el, num) {
                $rating = $(el);
                var $item = $rating.find(".rating-item");

                // 1、事件委托，通过第二个参数（选择器）将事件过滤出来；第三个参数是传递给函数的数据;使用事件委托里面的this指向是触发事件的元素，不是委托的元素
                $rating.on("mouseover", ".rating-item", "mouseover", function (event) {
                    lightOn($item, $(this).index() + 1);
                    console.log(event.data);
                }).on("click", ".rating-item", function () {
                    lightOn($item, $(this).index() + 1);
                    num = $(this).index() + 1;
                }).on("mouseout", ".rating-item", function () {
                    lightOn($item, num);
                })

                lightOn($item, num);
            };

            // 4、为了使得不要每次init的时候去初始化一次lighton方法，所以从init中单独提出来
            var lightOn = function ($item, num) {
                $item.each(function (index) {
                    if (index < num) {
                        $(this).css('background-position', '0 -94px');
                    } else {
                        $(this).css("background-position", '0 0');
                    }
                })
            };

            // 5、jquery插件化
            $.fn.extend({
                rating: function (num) {
                    // 找到的可能有多个元素，所以做一个循环;同时将它自身返回出去
                    return this.each(function () {
                        // 这里的this不是jquery对象
                        init(this, num);
                    })
                }
            })

            // 3、通过闭包来实现复用
            return {
                init: init
            };

        })();

        // var r1 = rating.init("#rating", 2);
        var r1 = $("ul").rating(2).css("background-color", "black");
        // var r2 = rating.init("#rating1", 3);
        console.log(r1);
    </script>

</body>

</html>